﻿#pragma once
#ifndef WRMATRIX_H
#define WRMATRIX_H

#include "../WRBasics.h"
#ifdef WRDEBUG
#include "../Runtime/WRException.h"
#endif

//表示矩阵。
template <class T> class WRMatrix
{
private:
    T* m_data;
    WRu m_size;
    WRu m_rows;

public:
    //初始化矩阵。
    inline WRMatrix(void)
    {
        m_data = 0;
        m_size = 0;
        m_rows = 0;
    }
    //初始化矩阵。
    inline WRMatrix(T* data, WRu size, WRu rows)
    {
        m_data = data;
        m_size = size;
        m_rows = rows;
    }

    //获取数据数量。
    inline WRu size(void) const
    {
        return m_size;
    }
    //获取数据行数。
    inline WRu rows(void) const
    {
        return m_rows;
    }

    //获取数据内容。
    inline const T* data(void) const
    {
        return m_data;
    }
    //获取数据内容。
    inline T* data(void)
    {
        return m_data;
    }

    //获取指定行的数据。
    inline const T* data(WRu rowIndex) const
    {
#ifdef WRDEBUG
        if (rowIndex >= m_rows)
        {
            throw WRArgumentOutOfRangeException();
        }
#endif
        return m_data + rowIndex * m_size;
    }
    //获取指定行的数据。
    inline T* data(WRu rowIndex)
    {
#ifdef WRDEBUG
        if (rowIndex >= m_rows)
        {
            throw WRArgumentOutOfRangeException();
        }
#endif
        return m_data + rowIndex * m_size;
    }

    //获取指定位置的数据值。
    inline const T& operator[](WRu rowIndex, WRu index) const
    {
#ifdef WRDEBUG
        if (rowIndex >= m_rows)
        {
            throw WRArgumentOutOfRangeException("rowIndex");
        }
        if (index >= m_size)
        {
            throw WRArgumentOutOfRangeException("index");
        }
#endif
        return m_data[rowIndex * m_size + index];
    }
    //获取指定位置的数据值。
    inline T& operator[](WRu rowIndex, WRu index)
    {
#ifdef WRDEBUG
        if (rowIndex >= m_rows)
        {
            throw WRArgumentOutOfRangeException("rowIndex");
        }
        if (index >= m_size)
        {
            throw WRArgumentOutOfRangeException("index");
        }
#endif
        return m_data[rowIndex * m_size + index];
    }
};

#endif // WRMATRIX_H

